package com.hmdp.config;

import com.hmdp.utils.LoginInterceptor;
import com.hmdp.utils.RefreshTokenInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

/**
 * mvc 配置
 */
@Configuration
public class MvcConfig implements WebMvcConfigurer {

    /**
     * 使用了Configuration注解
     * 接受spring管理
     * <p>
     * <p>
     * <p>
     * 两个注解都可以完成依赖注入功能。
     * 1.@Autowired：
     *
     * @Autowired ：默认是以byType按类型自动注入。
     * @Autowired + @Qualifier(""名称"")：将按照名称自动注入
     * <p>
     * 2.@Resource：
     * @Resource() 如果没有指定name属性，当注解写在字段上时，默认取字段名进行按照名称注入，
     * 如果注解写在setter方法上默认取属性名进行注入。
     * 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是，如果name属性一旦指定，就只会按照名称进行装配。
     * @Resource(name="""") 将按照名称自动注入
     */
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 添加拦截器
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new LoginInterceptor());
        // 添加不需要拦截的路径,**代表所有
        interceptorRegistration.excludePathPatterns(
                "/voucher/**",
                "/upload/**",
                "/shop/**",
                "/shop-type/**",
                "/blog/hot",
                "/user/code",
                "/user/login"
        ).order(1);

        registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).addPathPatterns("/**").order(0);
    }
}
